package cn.shengchao.examstar.ai.domain.repository;

import cn.shengchao.examstar.ai.domain.model.StudyPlan;
import cn.shengchao.examstar.ai.domain.model.studyplan.StudyPlanId;
import cn.shengchao.examstar.ai.domain.valueobject.SpecificationType;
import cn.shengchao.examstar.ai.domain.valueobject.StudyPlanStatus;
import cn.shengchao.examstar.ai.domain.valueobject.UserId;

import java.util.List;
import java.util.Optional;

/**
 * 学习计划领域仓储接口
 * 定义领域对象的持久化操作
 * 遵循DDD仓储模式，只包含纯粹的领域操作
 */
public interface IAiStudyPlanRepository {
    
    /**
     * 保存学习计划（新增或更新）
     */
    StudyPlan save(StudyPlan studyPlan);
    
    /**
     * 根据ID查找学习计划
     */
    Optional<StudyPlan> findById(StudyPlanId id);
    
    /**
     * 根据用户ID查找所有学习计划
     */
    List<StudyPlan> findByUserId(UserId userId);
    
    /**
     * 根据类目获取学习计划列表
     */
    List<StudyPlan> findBySpecificationType(SpecificationType specificationType);

    /**
     * 根据用户ID和类目查找学习计划列表
     */
    Optional<StudyPlan> findByUserIdAndSpecificationType(UserId userId, SpecificationType specificationType);
    
    /**
     * 根据用户ID和状态查找学习计划
     */
    List<StudyPlan> findByUserIdAndStatus(UserId userId, StudyPlanStatus status);
    
    /**
     * 根据状态查找学习计划
     */
    List<StudyPlan> findByStatus(StudyPlanStatus status);

    boolean existsByUserIdAndSpecificationType(UserId userId, SpecificationType specificationType);

    /**
     * 检查是否存在指定类目的学习计划
     */
    boolean existsBySpecificationType(SpecificationType specificationType);
    
    /**
     * 检查用户是否已有指定类目的活跃学习计划
     */
    boolean existsActiveByUserIdAndSpecificationType(UserId userId, SpecificationType specificationType);

    List<StudyPlan> findInProgressPlansByUserId(UserId userId);

    /**
     * 根据类目查找正在进行的学习计划
     */
    List<StudyPlan> findInProgressPlansBySpecificationType(SpecificationType specificationType);

    /**
     * 删除学习计划
     */
    void delete(StudyPlan studyPlan);
    
    /**
     * 根据ID删除学习计划
     */
    void deleteById(StudyPlanId id);
    
    /**
     * 统计用户的学习计划数量
     */
    long countByUserId(UserId userId);
    
    /**
     * 统计指定状态的学习计划数量
     */
    long countByStatus(StudyPlanStatus status);
    
    /**
     * 分页查询用户的学习计划
     */
    List<StudyPlan> findByUserIdWithPagination(UserId userId, int page, int size);
    
    /**
     * 查找即将到期的学习计划（用于提醒功能）
     */
    List<StudyPlan> findExpiringPlans(int daysBeforeExpiry);
    
    /**
     * 查找长时间未更新的学习计划
     */
    List<StudyPlan> findStagnantPlans(int daysWithoutUpdate);
}